home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / c / etc / status.c < prev    next >
C/C++ Source or Header  |  1991-10-23  |  9KB  |  247 lines

  1. /*
  2.  * status.c --
  3.  *
  4.  *     Returns the message associated with a status value in 
  5.  *    the status.h file.
  6.  *
  7.  * Copyright 1986 Regents of the University of California
  8.  * Permission to use, copy, modify, and distribute this
  9.  * software and its documentation for any purpose and without
  10.  * fee is hereby granted, provided that the above copyright
  11.  * notice appear in all copies.  The University of California
  12.  * makes no representations about the suitability of this
  13.  * software for any purpose.  It is provided "as is" without
  14.  * express or implied warranty.
  15.  */
  16.  
  17. #ifndef lint
  18. static char rcsid[] = "$Header: /sprite/src/lib/c/etc/RCS/status.c,v 1.10 91/10/23 16:46:56 mgbaker Exp $ SPRITE (Berkeley)";
  19. #endif not lint
  20.  
  21. #include <sprite.h>
  22. #include <status.h>
  23. #include <stdio.h>
  24.  
  25. typedef struct {
  26.     char *name;
  27.     char **array;
  28.     int   size;
  29. } StatusMsgs;
  30.  
  31. /*---------------------------------------------*/
  32.  
  33. /* Many of the gen messages are from string/strerror.c */
  34. /*    gen.stat    */
  35. static char *genStatusMsgs[] = {
  36. "the operation was successful",
  37. "there was an error",
  38. "the system call was aborted by a signal",
  39. "the user did not have the required permission",
  40. "this operation or feature isn't implemented",
  41. "an argument to a call was invalid",
  42. "the operation did not complete within the timeout period.",
  43. "not owner",                /* EPERM */
  44. "no such file or directory",        /* ENOENT */
  45. "interrupted system call",        /* EINTR */
  46. "argument list too long",        /* E2BIG */
  47. "no more processes",            /* EAGAIN */
  48. "permission denied",            /* EACCESS */
  49. "bad address in system call argument",    /* EFAULT */
  50. "file already exists",            /* EEXIST */
  51. "invalid argument",            /* EINVAL */
  52. "file too large",            /* EFBIG */
  53. "no space left in file system domain",    /* ENOSPC */
  54. "math result unrepresentable",        /* ERANGE */
  55. "identifier removed",            /* EIDRM */
  56. };
  57.  
  58. /*    proc.stat    */
  59. static char *procStatusMsgs[] = {
  60. "the file name to exec was not null terminated",
  61. "the a.out format of the file to be exec'd was incorrect",
  62. "the virtual memory system ran out of segments",
  63. "you are the child of a fork",
  64. "proc_Wait did not find any exited or detached processes of interest",
  65. "the process ID is not in the proper range or the process doesn't exist",
  66. "the specified process's user ID does not match the current process's uid",
  67. "the process doesn't have any children to wake it up from Proc_Wait",
  68. "the family ID is not in the proper range or the family doesn't exist",
  69. "the variable trying to be retrieved from the environment has not been set",
  70. "the environment variable name or value was not null terminated",
  71. "the environment has reached its maximum size and all entries are in use",
  72. "the node identifier for process migration is not a valid node specifier",
  73. "the node is refusing to accept processes for migration",
  74. "a string passed to a system call was not null terminated",
  75. "no kernel stacks are available (too many processes)",
  76. "the peer process of a migrated process does not exist",
  77. };
  78.  
  79. /*    sys.stat    */
  80. static char *sysStatusMsgs[] = {
  81. "address given by the user for a system call was bad",
  82. "the argument to a system call was invalid",
  83. "the constant specified for a system call was invalid",
  84. };
  85.  
  86. /*    rpc.stat    */
  87. static char *rpcStatusMsgs[] = {
  88. "a consistency check revealed an invalid parameter passed to an RPC routine",
  89. "no channels were available to conduct a Remote Procedure Call",
  90. "no Reply to an RPC request within a threshold time limit",
  91. "received a large number of acknowledgments but no answer to an RPC request",
  92. "a consistency check revealed an internal error in the RPC system",
  93. "the server received a request with an invalid procedure id",
  94. "the client received a null error code from the server",
  95. "the parameter area for the RPC was more that 1K",
  96. "the data area for the RPC was more that 16K",
  97. "there is no reply for this RPC",
  98. "the host is up (booting), but its RPC system is off",
  99. "a client with a `ramp down' policy received a negative ack from a server",
  100. "the requested prefix does not exist",
  101. };
  102.  
  103. /*    fs.stat    */
  104. static char *fsStatusMsgs[] = {
  105. "the permissions on the file prohibit the requested access",
  106. "bad argument to a filesystem routine",
  107. "the operation on the remote file is not supported",
  108. "the operation on the local file is not supported",
  109. "the operation on the device file is not supported",
  110. "the new stream ID requested is too large",
  111. "the master process of a pseudo-device has closed its connection (INTERNAL)",
  112. "the reader of the pipe died",
  113. "no disk space available for write",
  114. "lookup re-direct from a file server (INTERNAL)",
  115. "there is no file handle for a prefix (INTERNAL)",
  116. "new information has been added to the prefix table (INTERNAL)",
  117. "the file does not exist",
  118. "the read or write call could not complete immediately",
  119. "the buffer is too large to be written",
  120. "an invalid operation was attempted on a directory",
  121. "a non-directory file was specified where a directory was needed",
  122. "the caller did not own the file",
  123. "the file handle is out of date",
  124. "the file already exists",
  125. "an attempt was made to delete a non-empty directory",
  126. "too many links were expanded during name lookup",
  127. "a Rename or HardLink was attempted between domains",
  128. "the operation did not complete within the specified time",
  129. "no shared lock is held on the file",
  130. "no exclusive lock is held on the file",
  131. "the file's type doesn't match what is required by Fs_Open",
  132. "the file has been removed by the server (INTERNAL)",
  133. "the file can't be used or is busy already",
  134. "the stream does not support reposition of the read write access position",
  135. "the domain is not attached",
  136. "version mis-match on reopen (INTERNAL)",
  137. "the file isn't cacheable on a remote client (INTERNAL)",
  138. };
  139.  
  140. /*    vm.stat    */
  141. static char *vmStatusMsgs[] = {
  142. "the address given to allocate virtual memory was not in a heap or code segment",
  143. "there is insufficient virtual memory in the segment to expand it",
  144. "a read from the file server on a page fault returned less than a page",
  145. "a write to the file server wrote less than a page",
  146. "the swap file for the process could not either be opened, read, or written",
  147. "the virtual memory system ran out of segments",
  148. };
  149.  
  150. /*    sig.stat    */
  151. static char *sigStatusMsgs[] = {
  152. "the signal number is not in the range 0 to 31",
  153. "the action is not one of the valid actions",
  154. };
  155.  
  156. /*    dev.stat    */
  157. static char *devStatusMsgs[] = {
  158. "a bus error occurred during DMA because something wasn't mapped",
  159. "the device unit number doesn't correspond to an existing device",
  160. "the device did not respond after a timeout period",
  161. "the device is off-line",
  162. "the handshaking protocol with the device failed",
  163. "too many retriable errors occurred",
  164. "no such device exists",
  165. "an invalid argument was passed to a device driver",
  166. "a device encountered a hard, uncorrectable, error",
  167. "the end of tape was encountered during a command",
  168. "no tape reel or cartridge is loaded in the drive",
  169. "a command to a device completed prematurely",
  170. "there is no current sense information",
  171. "an attempt was made to rewrite write-once data or to read unwritten data",
  172. "the device is busy",
  173. "the device has been reset",
  174. };
  175.  
  176. /*    net.stat    */
  177. static char *netStatusMsgs[] = {
  178. "the remote network cannot be reached from this host.",
  179. "the remote host is cannot be reached from this host.",
  180. "the remote host refused to accept the connection.",
  181. "the connection was reset by the remote host.",
  182. "no connection requests are pending.",
  183. "the socket is already connected to a remote peer.",
  184. "the socket is not connected to a remote peer.",
  185. "the socket address is already in use.",
  186. "the socket address is not available on this host.",
  187. "an unknown protocol was specified.",
  188. "an invalid operation was attempted on the socket.",
  189. "an invalid option was specified.",
  190. };
  191.  
  192. static StatusMsgs statusMsgs[] = {
  193.     {"Gen",      genStatusMsgs       ,      20},
  194.     {"Proc",      procStatusMsgs      ,      17},
  195.     {"Sys",      sysStatusMsgs       ,      3},
  196.     {"Rpc",      rpcStatusMsgs       ,      11},
  197.     {"Fs",      fsStatusMsgs        ,      33},
  198.     {"Vm",      vmStatusMsgs        ,      6},
  199.     {"Sig",      sigStatusMsgs       ,      2},
  200.     {"Dev",      devStatusMsgs       ,      16},
  201.     {"Net",      netStatusMsgs       ,      12},
  202. };
  203. static int maxNumModules = 9;
  204.  
  205. /*---------------------------------------------*/
  206.  
  207.  
  208. /*
  209.  *-----------------------------------------------------------------------
  210.  *
  211.  * Stat_GetMsg --
  212.  *
  213.  *    Given a ReturnStatus, return a string indicating the meaning
  214.  *    of the status.
  215.  *
  216.  * Results:
  217.  *    A pointer to a statically-allocated string. If the status is
  218.  *    invalid, a customized error message is returned.
  219.  *
  220.  * Side Effects:
  221.  *    None
  222.  *
  223.  *-----------------------------------------------------------------------
  224.  */
  225.  
  226. char *
  227. Stat_GetMsg(status)
  228.     ReturnStatus  status;       /* Status for which message is desired */
  229. {
  230.     int              module = STAT_MODULE(status);
  231.     int              msg = STAT_MSGNUM(status);
  232.     static  char  errMsg[100];        /* static space for erroneous stati */
  233.  
  234.     if (module >= maxNumModules) {
  235.     (void) sprintf(errMsg, "Warning: invalid module # in status %x",
  236.                status);
  237.     return(errMsg);
  238.     } else if (msg >= statusMsgs[module].size) {
  239.     (void) sprintf(errMsg,
  240.               "Warning: invalid message # for %s module in status %x", 
  241.                statusMsgs[module].name, status);
  242.     return(errMsg);
  243.     } else {
  244.     return(statusMsgs[module].array[msg]);
  245.     }
  246. }
  247.